package package_traitement;

import java.awt.image.BufferedImage;



/**
 * Classe permetant la realisation d'une matrice de niveau de gris
 * 
 * @author Kevin De Jesus Ferreira
 * 
 */
public class MatriceTonGris implements Operande {

	/**
	 * Permet d'obtenir la couleur grise rgb d'une couleur argb
	 * 
	 * @param rgb
	 *            - Couleur argb du pixel
	 * @return - Couleur RGB du pixel
	 */
	public static int convert2Gray(int argb) {

		int r = ((argb >> 16) & 0xFF);
		int g = ((argb >> 8) & 0xFF);
		int b = (argb & 0xFF);
		int moy = ((r + g + b) / 3);
		return moy;
	}

	private int dx; // Largeur de l'image
	private int dy; // hauteur de l'image
	private int[][] matrice; // Matrice de ton gris

	private int niveau = 16; // Nombres de niveaux de gris
	
	/**
	 * Constructeur de la matrice de ton gris. Charge l'image dont le nom est
	 * passe en parametre Et pour chaque pixel determine son niveau de gris
	 * 
	 * @param fileName
	 *            - Nom de l'image
	 */
	public MatriceTonGris(BufferedImage b) {

		BufferedImage image = b; // Charger l'image

		if (image!=null){

			this.dx = image.getWidth(); // Largeur de l'image
			this.dy = image.getHeight(); // Hauteur de l'image
			this.matrice = new int[dx][dy]; // Creation de la matrice

			for (int i = 0; i < dx; i++) {

				for (int j = 0; j < dy; j++) {

					// Pour tout les pixels de l'image on trouve son niveau de gris
					this.matrice[i][j] = niveauDeGris(convert2Gray(image.getRGB(i,
							j)));

				}
			}
		}

	}
	
	/**
	 * Permet de savoir à quel niveau de gris appartient la couleur rgb passee
	 * en parametre
	 * 
	 * @param rgb
	 *            - Couleur rgb dont on veut connaitre le niveau de gris
	 * @return - Retourne le niveau de gris de la couleur rgb
	 */
	public int niveauDeGris(int rgb) {

		int niveauMax = 256 / this.niveau;
		int niveauTrouve = 0;
		boolean trouve = false;

		if (256 % this.niveau != 0) { // Si la division n'a pas de reste

			niveauMax++; // arrondi au dessus
		}

		int changementNiveau = niveauMax;

		do { // tant que l'on trouve pas le bon niveau et que l'on depasse pas
			// 256

			if (rgb <= niveauMax) { // Si la couleur est inferieure à la couleur
				// max du niveau

				trouve = true;

			} else { // La couleur se trouve dans le niveau du dessus

				niveauTrouve++;
				niveauMax = niveauMax + changementNiveau;

				if (niveauMax > 256) { // Si le max du niveau depasse 256

					niveauMax = 256;
				}
			}

		} while (!trouve && niveauMax != 256);

		return niveauTrouve;
	}

	/**
	 * Affiche une partie de la matrice en fonction des coordonnees passees en
	 * parametres
	 * 
	 * @param dxmin
	 *            - Coordonnee horizontale minimum
	 * @param dxmax
	 *            - Coordonnee horizontale maximum
	 * @param dymin
	 *            - Coordonnee Verticale minimum
	 * @param dymax
	 *            - Coordonnee Verticale maximum
	 * @return - Retourne l'affichage de la matrice
	 */
	public String afficherParti(int dxmin, int dxmax, int dymin, int dymax) {

		String affichage = "";

		for (int i = dxmin; i < dxmax; i++) {

			for (int j = dymin; j < dymax; j++) {

				affichage += this.matrice[i][j] + " ";
			}

			affichage += "\n";
		}

		return affichage;

	}

	// Affichage
	public String afficher(){
		String affichage ="";
		for(int i=0; i< this.dy;i++){
			affichage+=this.matrice[0][i];
		}
		return affichage ;
	}
	public String toString() {

		String affichage = "";
		for (int i = 0; i < this.dx; i++) {

			for (int j = 0; j < this.dy; j++) {

				affichage = affichage + this.matrice[i][j] + " ";

			}


		}

		return affichage;
	}




	// Getter and Setter

	public int getDx() {
		return dx;
	}

	public int getDy() {
		return dy;
	}

	public int[][] getMatrice() {
		return matrice;
	}

	public int getNiveau() {
		return niveau;
	}

	public void setDx(int dx) {
		this.dx = dx;
	}

	public void setDy(int dy) {
		this.dy = dy;
	}

	public void setMatrice(int[][] matrice) {
		this.matrice = matrice;
	}

	public void setNiveau(int niveau) {
		this.niveau = niveau;
	}


}
